package main

import (
	"crypto/sha256"
	"fmt"
)

/**
数组
1、数组很少用作函数参数，一般使用slice来代替数组
*/
type Currency int

const (
	USD Currency = iota // 美元
	EUR                 // 欧元
	GBP                 // 英镑
	RMB                 // 人民币
)

func main() {
	var a [3]int
	fmt.Println(a[0])
	fmt.Println(a[len(a)-1])

	for i, value := range a {
		fmt.Printf("%d %d\n", i, value)
	}

	for _, value := range a {
		fmt.Printf("%d\n", value)
	}

	// 数组位置出现...省略号，表示数组的长度是根据初始化值的个数来计算的
	q := [...]int{1, 2, 3, 4, 5, 6, 7, 8, 9}
	// 输出数组q的长度与类型，[9]int
	fmt.Printf("%T\n", q)

	symbol := [...]string{USD: "$", EUR: "€", GBP: "￡", RMB: "￥"}
	fmt.Println(RMB, symbol[RMB])

	// 定义一个含有100个元素的数组r,最后一个元素被初始化为-1，其他元素都是用0初始化
	r := [...]int{99: -1}
	fmt.Println(r[10])
	fmt.Println(r[20])

	// Sum256()函数对任意的一个字节slice类型的数据生成一个对应的消息摘要，消息摘要大小是256bit,对应[32]byte数组类型
	// 1、如果两个消息摘要相同，可以认为两个消息本身是相同的
	// 2、理论上存在hash碰撞的情况，实际情况下可以忽略
	c1 := sha256.Sum256([]byte("x"))
	c2 := sha256.Sum256([]byte("X"))
	fmt.Printf("%x\n%x\n%t\n%T\n", c1, c2, c1 == c2, c1)

}

// 1、定义一个函数：显示的传入一个数组指针，且默认数组中每个元素的值都是0。
// 方式1
func zero_1(ptr *[32]byte) {
	for i := range ptr {
		ptr[i] = 0
	}
}

// 方式2（简洁写法），一个32字节的数组
func zero_2(ptr *[32]byte) {
	*ptr = [32]byte{}
}
